package 第十一章_网络编程.第十一章_网络编程_简易版中继站;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class client {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //用户输入
        Scanner input = new Scanner(System.in);
        //创建线程池对象 es  单一线程
        final ExecutorService es = Executors.newSingleThreadExecutor();
        //拼接字发送和接收消息  socket
        Socket socket = new Socket("localhost", 8888);
        System.out.println("服务器连接成功！");
        //设置对象传输通道 oos ois
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        System.out.println("请输入你的名字:");
        //输入用户名
        String name=input.nextLine();
        //构造 msg的封装形式
        Message msg=new Message(name,null,MessageType.TYPE_LOGIN,null);
        //封装格式写入->oos
        oos.writeObject(msg);
        //读取服务器转发的信息， msg 用的是上面的封装格式和相同对象
        msg=(Message)ois.readObject();
        //打印读取到的信息 info和from字段
        System.out.println(msg.getInfo()+msg.getFrom());
        //执行线程  对象输入流
        ReadInfoThread rt=new ReadInfoThread(ois);
        es.execute(rt);
        boolean flag=true;
        while(flag){
            //循环代码块内创建对象msg
            //使用的是默认的字段的默认值   如果没设定就是 （null和0）
            //将message的字段写入信息 并写入oos 对象输出流中
            msg=new Message();
            System.out.print("To: ");
            msg.setTo(input.nextLine());
            msg.setFrom(name);
            msg.setType(MessageType.TYPE_SEND);
            System.out.print("Info:");
            msg.setInfo(input.nextLine());
            oos.writeObject(msg);

        }
    }
}
class ReadInfoThread implements  Runnable{
    private ObjectInputStream in;
    private boolean flag=true;
    public void setFlag(Boolean flag){
        this.flag=flag;
    }

    public ReadInfoThread(ObjectInputStream in) {
        this.in = in;
    }

    @Override
    public void run() {
        try {
            while (flag) {
                //读取ois流中的对象 并转换成Message类型
                //打印到终端的格式：
                Message message = (Message) in.readObject();
                System.out.println("\n[" + message.getFrom() + "]对我说: " + message.getInfo());
            }
            if (in != null) {
                in.close();
            }
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

